from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate, migrate

# 初始化 SQLAlchemy对象
db = SQLAlchemy()
migrate = Migrate()


# 工厂函数，用于项目初始化或者数据库创建
def create_app():
    app = Flask(__name__)
    # 加载配置文件
    # 如果设置为 silent=True，则在加载 settings.py 文件时出现错误时不会抛出异常，而是继续执行后续代码
    # 如果设置为 silent=False，则会抛出异常并中断程序执行
    app.config.from_pyfile('settings.py', silent=True)

    # 初始化数据库
    db.init_app(app)
    # 注册迁移对象
    migrate.init_app(app,db)

    # 引入blog视图 (这个引入必须放在create_app里面)
    from app.blog import views as blog  # 应用上下文
    from app.admin import views as admin  # 应用上下文
    # 注册蓝图
    app.register_blueprint(blog.bp)
    app.register_blueprint(admin.bp)

    app.add_url_rule('/', endpoint='index', view_func=blog.index)


    # 在app所在的上下文中, 注册数据模型
    # 得把数据模型放在app上下文范围内才可用被指令检测到
    from app.blog import models
    from app.admin import models

    return app